perm filename PCALL.FAI[MUS,LCS] blob
sn#088115 filedate 1974-02-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE BUFFER
C00005 00003 PLA2: SETZM FILBLK+3
C00010 ENDMK
C⊗;
TITLE BUFFER;
INTERNAL PLAY
; CALL PLAY(FILENAME,SPEED,NCHNS)
A ← 1 ;WORK
B ← 2 ;WORK
RET ← 3 ;RETURN ACCUMULATOR
BUFSIZ ←=2048
↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
↓BUF1: BLOCK BUFSIZ+1 ;BUFFER 1
BUF2: BLOCK BUFSIZ+1 ;BUFFER 2
FILBLK: 0 ;FILENAME FOR INPUT
'DMD ' ;EXTENSION
0 ;INFORMATION ON FILE
0 ;PROJECT PROG#
CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
0
INLIST: 0 ;WILL CONTAIN AN IOWD
0
OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
3650 ;MAGIC BITS FOR 136.
OUTBIT: 4000 ;BITS FOR D-A
BLOCK 2
OPDEF READCH [51B8]
OPDEF MESSAGE[51B8!3B12]
PLAY: 0
CALLI 0,0 ;RESET I/O DEVICES
OPEN DSKCHN,[17 ;MODE
'DSK ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
HALT PLAY ;RESTART IF DEVICE IS UNAVAILABLE
SETZM FILBLK+3 ;FOR RESTART
;;LX: MESSAGE [ASCIZ/
;; TYPE `P' TO PLAY FROM DISK
;;/]
;; readch a
;; caie a,"P"
;; jrst lx
;; skipe filblk+3 ;is this first time through ?
;; jrst pla2 ;No. Parameters already set up.
;FIND OUT NUMBER OF CHANNELS AND
;THE SPEED.
; MESSAGE [ASCIZ/HOW MANY CHANNELS? /]
; READCH A
; SUBI A,"0"+1 ;CONVERT TO BINR AND ADD 1
MOVE A,@1(16)
SUBI A,1
DPB A,[POINT 2,OUTBIT,26]
; MESSAGE [ASCIZ/ WHAT IS THE SPEED? /]
; READCH A
; SUBI A,"0"
MOVE A,@2(16)
DPB A,[POINT 3,OUTBIT,32]
; LX: MESSAGE [ASCIZ/
; TYPE `P' TO PLAY FROM DISK OR `E' TO EXIT
; /]
; readch a
; cain a,"E"
; JRA 16,3(16)
; caie a,"P"
; jrst lx
PLA2: SETZM FILBLK+3
MOVE A,(16) ;ADR OF FILENAME
SUBI A,1
HRLI A,000700 ;BYTE POINTER
MOVEI B,FILBLK ;ADDRESS FOR SIXBIT
SUBI B,1
HRLI B,000600
MOVEI 0,0
SUBI 0,5
SIXCNV: ILDB 4,A
ADDI 4,40
IDPB 4,B
AOJL 0,SIXCNV
LOOKUP DSKCHN,FILBLK
JRST [MESSAGE[ASCIZ/
*** MUSIC FILE NOT FOUND/]
JRA 16,3(16)]
;EXIT IF FILE IS MISSING
XOPEN: MOVSI 'XGP' ;DOWN TO XGPOK FOR XGP CONFLICT.
DEVUSE 0,
HLRZ 0,0
CAIN 400000
JRST XGPOK
INIT 16,17
SIXBIT .XGP.
0
JRA 16,3(16)
XGPOK: OPEN ADCHN,[117 ;MODE
'AD ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
JRST [MESSAGE[ASCIZ/
***D-A NOT AVAILABLE/]
JRA 16,3(16)]
;EXIT IF D-A IS UNAVAILABLE
SPWAR: SPCWAR 17,[CALLI]
; MESSAGE [ASCIZ/ GO? /]
; READCH A
LNTH: movs a,filblk+3 ;get length of file.
movnm a,nwd
; -----------------------------------------
;BEGIN MAIN BODY OF PROGRAM
LOOP: JSP RET,SUB ;ROUTINE TO READ AND WRITE
BUF1-1 ;USE BUF1 FOR THE I/O
JUMPLE B,OUT ;DONE
JSP RET,SUB ;CALL IT AGAIN
BUF2-1 ;USE BUF2 FOR THE I/O
JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
OUT: close dskchn, ;END OF PROGRAM.
releas adchn,
RELEASE 16,
SPCWAR 0,'SSW'
JRA 16,3(16)
; jrst lx
;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
; 1(RET) WILL BE THE RETURN
; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
; PUT IN THE RIGHT HALF OF THE IOWD.
; A WILL BE A WORK REGISTER
; B WILL BE TESTED ON THE OUTSIDE.
SUB: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
ADDB A,NWD ;A←NWD-BUFSIZ
;NWD←NWD-BUFSIZ
MOVE B,A ;SAVE B TO BE TESTED FOR LAST
;TIME.
JUMPL A,LAST ;SET UP FOR LAST TIME.
MOVEI A,0
;THE IOWD LOOKS LIKE:
; [-BUFSIZ / BUFI-1]
LAST: ADDI A,BUFSIZ
MOVNS A ;COMPLEMENT A
HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
;TO THE LEFT SIDE OF A.
MOVSM A,INLIST ;SWAP A AND MOVE IT.
MOVSM A,OUTWC ;SAME FOR OUTPUT.
INPUT DSKCHN,INLIST ;READ A RECORD.
OUTPUT ADCHN,OUTWC ;WRITE THE RECORD.
JRST 1(RET) ;RETURN
END